package PEC5_Test;

import edu.uoc.tds.pac4.beans.Centre;
import edu.uoc.tds.pac4.beans.EstEventsAssistent;
import edu.uoc.tds.pac4.beans.EstIngressos;
import edu.uoc.tds.pac4.beans.EstPercentatgeAsis;
import edu.uoc.tds.pac4.beans.Participant;
import edu.uoc.tds.pac4.beans.TipusEvent;
import edu.uoc.tds.pac4.beans.Universitat;
import edu.uoc.tds.pac4.common.GestioEventsException;
import edu.uoc.tds.pac4.interfaces.RemoteInterface;
import edu.uoc.tds.pac4.servidor.RemoteImplementation;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Pedro Bauzá Picó
 */
public class testEstadisticas {

    /*
     * Metodo principal que llama a cada una de las pruebas
     */
    private static void test(RemoteInterface remot) {
        System.out.println("INICIO DEL TEST");
        System.out.println("**********************************");
        System.out.println("");
        //Recuperacion de los valores de Universidades
        valoresUniversidades(remot);

        //Recuperacion de los valores de centros filtrado por universidad
        valoresCentros(remot);

        //Recuperacion de los valores de tipo de Evento
        valoresTipoEventos(remot);

        //Recuperacion de los valores de participantes
        valoresParticipantes(remot);

        //Recuperacion de los eventos de una asistentes
        consultaEventoAsistente(remot);

        //Recuperacion de los ingresos totales
        consultaIngresosTotales(remot);

        //Recuperacion de los porcentajes de asistencia
        consultaPorcentajesAsistencia(remot);

        System.out.println("FINAL DEL TEST");
        System.out.println("**********************************");
        System.out.println("");

    }

    private static void valoresUniversidades(RemoteInterface remot) {
        try {
            System.out.println("TEST: valoresUniversidades");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando obtencion de valores de universidades");
            Vector<Universitat> lista = remot.getUniversitats(true);

            if (!lista.isEmpty()) {
                Universitat universitat = lista.firstElement();
                System.out.println("Objeto Universitat");
                System.out.println("Codigo: " + universitat.getCodi());
                System.out.println("Nombre: " + universitat.getNom());
            }

            System.out.println("Prueba correcta de obtencion de valores de universidades\n");
        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para obtener valores de universidades\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para obtener valores de universidades\n");
        }
    }

    private static void valoresCentros(RemoteInterface remot) {
        try {
            System.out.println("TEST: valoresCentros");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando obtencion de valores de centros filtrados por universidad");
            Universitat universitat = new Universitat();
            universitat.setCodi("UIB");
            Vector<Centre> lista = remot.getCentres(universitat, true);

            if (!lista.isEmpty()) {
                Centre centre = lista.firstElement();
                System.out.println("Objeto Centre");
                System.out.println("Codigo: " + centre.getCodi());
                System.out.println("Nombre: " + centre.getNom());
            }

            System.out.println("Prueba correcta de obtencion de valores de centros filtrados por universidad\n");
        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para obtener valores de centros filtrados por universidad\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para obtener valores de centros filtrados por universidad\n");
        }
    }

    private static void valoresParticipantes(RemoteInterface remot) {
        try {
            System.out.println("TEST: valoresParticipantes");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando obtencion de valores de participantes");
            Vector<Participant> lista = remot.getParticipants(true);

            if (!lista.isEmpty()) {
                Participant participant = lista.firstElement();
                System.out.println("Objeto Participant");
                System.out.println("Codigo: " + participant.getCodi());
                System.out.println("Nombre: " + participant.getNom());
            }

            System.out.println("Prueba correcta de obtencion de valores de participantes\n");
        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para obtener valores de participantes\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para obtener valores de participantes\n");
        }
    }

    private static void valoresTipoEventos(RemoteInterface remot) {
        try {
            System.out.println("TEST: valoresTipoEventos");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando obtencion de valores de tipo eventos");
            Vector<TipusEvent> lista = remot.getTipusEvents(true);

            if (!lista.isEmpty()) {
                TipusEvent tipusEvent = lista.firstElement();
                System.out.println("Objeto TipusEvent");
                System.out.println("Codigo: " + tipusEvent.getCodi());
                System.out.println("Nombre: " + tipusEvent.getNom());
            }

            System.out.println("Prueba correcta de obtencion de valores de tipo eventos\n");
        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para obtener valores de tipo eventos\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para obtener valores de tipo eventos\n");
        }
    }

    private static void consultaEventoAsistente(RemoteInterface remot) {
        try {
            System.out.println("TEST: consultaEventoAsistente");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando la consulta de los eventos de un asistente");
            Participant par = new Participant();
            par.setCodi("bmuller");
            TipusEvent te = new TipusEvent();
            te.setCodi("JORN");
            Date dataInici = null;
            Date dataFi = null;
            boolean actius = true;
            Vector<EstEventsAssistent> lista = remot.getEstEventsAssistent(par, te, dataInici, dataFi, actius);
            System.out.println("Prueba correcta de la consulta de los eventos de un asistente\n");

            objetoEstEventsAssistent(lista);

        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para la consulta de los eventos de un asistente\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para la consulta de los eventos de un asistente\n");
        }
    }

    private static void objetoEstEventsAssistent(Vector<EstEventsAssistent> lista) {
        try {
            System.out.println("TEST: objetoEstEventsAssistent");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Prueba mostrar valores de objetos EstEventsAssistent");

            for (EstEventsAssistent estEventsAssistent : lista) {
                System.out.println(
                        "Centro: " + estEventsAssistent.getCentre() + "\n"
                        + "Evento: " + estEventsAssistent.getEvent() + "\n"
                        + "Universidad: " + estEventsAssistent.getUniversitat());
            }
            System.out.println("Prueba correcta de mostrar valores de objetos EstEventsAssistent\n");
        } catch (Exception ex) {
            System.out.println("Error para mostrar valores de objetos EstEventsAssistent\n");
        }
    }

    private static void consultaIngresosTotales(RemoteInterface remot) {
        try {
            System.out.println("TEST: consultaIngresosTotales");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando la consulta de los ingresos totales");
            Universitat uni = new Universitat();
            uni.setCodi("UIB");
            Centre cen = new Centre();
            cen.setCodi("FIIB");
            TipusEvent te = new TipusEvent();
            te.setCodi("JORN");
            Double ingresMinim = Double.valueOf("1");
            Double ingresMaxim = Double.valueOf("100000");

            Vector<EstIngressos> lista = remot.getEstIngressos(uni, cen, te, ingresMinim, ingresMaxim);
            System.out.println("Prueba correcta de la consulta de los ingresos totales\n");

            objetoEstIngressos(lista);

        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para la consulta de los eventos de un asistente\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para la consulta de los eventos de un asistente\n");
        }
    }

    private static void objetoEstIngressos(Vector<EstIngressos> lista) {
        try {
            System.out.println("TEST: objetoEstIngressos");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Prueba mostrar valores de objetos EstIngressos");

            for (EstIngressos estIngressos : lista) {
                System.out.println(
                        "Centro: " + estIngressos.getCentre() + "\n"
                        + "Tipo Evento: " + estIngressos.getTipusEvent() + "\n"
                        + "Universidad: " + estIngressos.getUniversitat());
            }
            System.out.println("Prueba correcta de mostrar valores de objetos EstIngressos\n");
        } catch (Exception ex) {
            System.out.println("Error para mostrar valores de objetos EstIngressos\n");
        }
    }

    private static void consultaPorcentajesAsistencia(RemoteInterface remot) {
        try {
            System.out.println("TEST: consultaPorcentajesAsistencia");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Probando la consulta de los porcentajes de asistencia");
            Universitat uni = new Universitat();
            uni.setCodi("UIB");
            Centre cen = new Centre();
            cen.setCodi("FIIB");
            TipusEvent te = new TipusEvent();
            te.setCodi("JORN");
            Date dataInici = null;
            Date dataFi = null;
            int assisMin = 20;
            int assisMax = 80;

            Vector<EstPercentatgeAsis> lista = remot.getEstPercentatgeAsis(uni, cen, te, dataInici, dataFi, assisMin, assisMax);
            System.out.println("Prueba correcta de la consulta de los porcentajes de asistencia\n");

            objetoEstPercentatgeAsis(lista);

        } catch (RemoteException ex) {
            System.out.println("Error en la conexion remota para la consulta de los eventos de un asistente\n");
        } catch (GestioEventsException ex) {
            System.out.println("Error para la consulta de los eventos de un asistente\n");
        }
    }

    private static void objetoEstPercentatgeAsis(Vector<EstPercentatgeAsis> lista) {
        try {
            System.out.println("TEST: objetoEstPercentatgeAsis");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("Prueba mostrar valores de objetos EstPercentatgeAsis");

            for (EstPercentatgeAsis estPercentatgeAsis : lista) {
                System.out.println(
                        "Centro: " + estPercentatgeAsis.getCentre() + "\n"
                        + "Tipo Evento: " + estPercentatgeAsis.getTipusEvent() + "\n"
                        + "Universidad: " + estPercentatgeAsis.getUniversitat() + "\n"
                        + "Evento: " + estPercentatgeAsis.getEvent() + "\n"
                        + "Asistentes: " + estPercentatgeAsis.getAssistents() + "\n"
                        + "Porcentaje: " + estPercentatgeAsis.getPercenAssistencia());
            }
            System.out.println("Prueba correcta de mostrar valores de objetos EstPercentatgeAsis\n");
        } catch (Exception ex) {
            System.out.println("Error para mostrar valores de objetos EstPercentatgeAsis\n");
        }
    }

    public static void main(String[] args) {
        RemoteInterface remot = null;
        try {
            System.out.println("Iniciando test del Subsistema Estadisticas");
            remot = new RemoteImplementation();
            //Inicializamos el test
            test(remot);
            System.out.println("Finalizando test del Subsistema Estadisticas");
        } catch (Exception e) {
            System.out.println("Error en la realizacion de las pruebas");
        }
    }
}
